#ifndef CLIENT_H_
#define CLIENT_H_

#include <fstream>

#include "Socket.h"
#include "ChatRecibirCliente.h"
#include "../vista/VentanaChat.h"
#include "Connection.h"

class Client {
private:
	Socket aSocket;

	Socket socketChat;
	const char *ip;
	int port;
	string nombrePersonaje;
	string tipoPersonaje;
	list<string> listaOponentes;
	Juego* juego;
	Builder* builder;
	int puertoChatRecv;
	int puertoChatSend;
	ChatRecibirCliente* chatRecibir;
	string nombreEscenario;
	queue<string> mensajesRecibidos;
	LoggerConsola logger;
	void eliminarDirectorio(string directorio);
	bool actualizarContrincante(Connection *conn, Juego *juego, int* cantidadOponentes);
	int actualizarEscenario(Connection* conn, Escenario* escenario);
	void actualizarPersonaje(Escenario* escenario, Personaje* personaje);
	void actualizarAccionFrizado(Personaje* personaje);
	void inicializarPosicionesVisitadas(string posicionesOcupadas, int pasosVision);
	void dibujarMensajesRecibidosChat(VentanaChat* ventanaChat);
	int actualizarEntidadesYPersonajesAtacados(Connection* conn, Escenario* escenario);
	int actualizarBonusEscenario(Connection* conn, Escenario* escenario);

	void inicializarEntidadesEscenario(string entidadesEscenario);
	void verificarDestruccionEntidad(Entidad* entidadActualizar, Casilla* casillaEntidad);
	void inicializarBonusEscenario(string dataBonus);
	void inicializarTiposEntidades(map<string,TipoEntidad*> tipos);


public:
	Client(const char *ip, int port, int puertoChatRecv, int puertoChatSend);

	void run(const char* ip);

	/**
	 * Inicia la conexion.
	 */
	int initConnection();
	int initConnectionChat();

	Socket& getSocket() {return aSocket;}

	void setNombrePersonaje(string nombrePersonaje);
	void setTipoPersonaje(string tipoPersonaje);
	void setIp(char* ip);
	void setPort(int port);
	int inicializarCliente();
	int verificarNombrePersonaje();

	list<string>& getListaOponentes();
	void setListaOponentes();

	void shutdownConnection();

	bool listaOponentesContiene(string nombre);

	void personajeElegido();
	void desbloquearSeleccion();

	void cargarEscenario(Builder* builder, Juego* juego,string dataProtagonista,string dataProtagonistasEscenario);
	string getNombrePersonaje();

	void agregarMensajeRecibido(string mensaje);
	void comprueboStatusDelProtagonista();
	void comprueboStatusEntidades();
};

#endif /* CLIENT_H_ */
